package com.ruralflow.framework.aspectj;

import com.ruralflow.common.core.domain.BaseEntity;
import com.ruralflow.common.utils.SecurityUtils;
import com.ruralflow.framework.web.service.PermissionService;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;


/**
 * 简单的切面类，用于替代频繁的权限验证
 *         if (permissionService.hasAnyRoles("common")) {
 *             // 是普通用户的话就只能查询创建人是自己的信息
 *             hukou.setCreateBy(SecurityUtils.getUsername());
 *         }
 */
@Aspect
@Slf4j
@Component
public class UserRoleLimiterAspect {

    @Autowired
    private PermissionService permissionService;

    /**
     * 配置切入点
     */
    @Pointcut("@annotation(com.ruralflow.common.annotation.UserRoleLimiter)")
    public void dataScopePointCut() {
        // Do nothing
    }

    /**
     * 前置通知
     */
    @Before("dataScopePointCut()")
    public void doBefore(JoinPoint joinPoint) {
        // 拦截后的操作
        handleDataScope(joinPoint);
    }

    /**
     * 处理数据权限
     * @param joinPoint 切点
     */
    protected void handleDataScope(final JoinPoint joinPoint) {
        // 获取被拦截方法的第一个实际参数
        BaseEntity baseEntity = (BaseEntity) joinPoint.getArgs()[0];
        if (!permissionService.hasRole("admin")) {
            // 不是管理员角色就只能查询自己创建的
            log.info("当前登录用户角色为普通用户，只能查询创建人自己的信息");
            baseEntity.setCreateBy(SecurityUtils.getUsername());
        }
    }

}
